package org.example.autofilearchiver.tool.DOCX;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.poi.xwpf.usermodel.*;
import org.example.autofilearchiver.toolclass.DOCX.DocxFile;
import org.example.autofilearchiver.toolclass.DOCX.DocxFileTemplate;
import org.example.autofilearchiver.toolclass.ELSE.FindDataWithStringAndNumberObject;
import org.example.autofilearchiver.toolclass.PDF.PDFFile;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * docx的工具类
 * 方法：
 * readDocxFile--读取docx的文本并返回
 */
@Data
@AllArgsConstructor

public class DocxTool {
    /**
     * 读取docx的文本并返回
     *
     * @param filePath docx的路径
     * @return List<String> docx的所有文本
     */
    public static List<String> readDocxFile(String filePath) {
        List<String> textLines = new ArrayList<>();

        try (FileInputStream fis = new FileInputStream(filePath);
             XWPFDocument document = new XWPFDocument(fis)) {

            // 读取段落中的文本
            for (XWPFParagraph paragraph : document.getParagraphs()) {
                textLines.add(paragraph.getText());
            }

            // 读取表格中的文本
            for (XWPFTable table : document.getTables()) {
                for (XWPFTableRow row : table.getRows()) {
                    for (XWPFTableCell cell : row.getTableCells()) {
                        // 合并单元格的文本
                        StringBuilder cellText = new StringBuilder();
                        for (XWPFParagraph p : cell.getParagraphs()) {
                            cellText.append(p.getText()).append("\n");
                        }
                        // 去除末尾多余的换行符（如果有的话）
                        if (cellText.length() > 0 && cellText.charAt(cellText.length() - 1) == '\n') {
                            cellText.setLength(cellText.length() - 1);
                        }
                        // 将单元格文本作为单独的行添加到列表中
                        textLines.add(cellText.toString());
                    }
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

        return textLines;
    }

//    /**
//     * 匹配docx文本得到模板标识id
//     * @param texts docx文本
//     * @param templates 所有文本
//     * @return matchedIds 模板标识id
//     */
//    public static List<Integer> matchTextsWithTemplates(List<String> texts, List<DocxFileTemplate> templates) {
//        List<Integer> matchedIds = new ArrayList<>();
//
//        // 遍历所有文本
//        for (String text : texts) {
//            // 遍历所有模板
//            for (DocxFileTemplate template : templates) {
//                // 遍历模板的标识数据
//                for (String identifier : template.getIdentifiers()) {
//                    // 如果文本包含标识数据，则添加模板的id到结果列表中（只添加一次，不重复）
//                    if (text.contains(identifier)) {
//                        matchedIds.add(template.getId());
//                        break;
//                    }
//                }
//            }
//        }
//
//        return matchedIds;
//    }

    /**
     * 匹配所有docx文本，根据matchWord和offset返回一个List<String>，得到有价值的数据，可能用来重命名pdf和归档文件夹
     * @param allTexts docx的所有文本
     * @param keywords 匹配词
     * @param increment 索引增量
     * @return pdfNames 返回一个List<String>，用来重命名pdf
     */
    public static List<String> matchTagsReturnUsefulTags(List<String> allTexts, List<String> keywords, List<Integer> increment) {
        List<String> matchedTexts = new ArrayList<>();
        int keywordIndex = 0; // 当前匹配的关键词索引
        int currentIndex = 0; // 当前遍历到的文本索引
        int currentIncrement = 0;//当前的增量索引

        while (currentIndex < allTexts.size() && keywordIndex < keywords.size()) {
            String currentText = allTexts.get(currentIndex);
            String keyword = keywords.get(keywordIndex);

            if (currentText.contains(keyword)) {
                // 计算下一个文本的索引（考虑索引增值）
                int nextIndex = currentIndex + increment.get(currentIncrement);

                // 检查下一个索引是否在文本列表范围内
                if (nextIndex < allTexts.size()) {
                    String matchedText = allTexts.get(nextIndex);
                    matchedTexts.add(matchedText);

                    // 移动到下一个关键词
                    keywordIndex++;
                    // 从nextIndex的下一个继续遍历
                    currentIndex = nextIndex+1;
                    //移动到下一个增量
                    currentIncrement++;
                } else {
                    // 如果下一个索引超出了文本列表的范围，则停止匹配当前关键词
                    // 但可以继续检查剩余的文本和关键词（由外层while循环处理）
                    // 这里不需要特别的操作，因为外层循环会根据currentIndex和allTexts.size()的关系自然停止
                }
            } else {
                // 如果没有找到匹配项，则继续检查下一个文本
                currentIndex++;
            }
        }

        return matchedTexts;
    }

    /**
     * 对DocxFileTemplate进行分组
     * @param docxFileTemplates 所有的DocxFileTemplate
     * @return 返回分好组的DocxFileTemplate
     */
    public static List<List<DocxFileTemplate>> groupDocxFileTemplates(List<DocxFileTemplate> docxFileTemplates) {
        List<List<DocxFileTemplate>> result = new ArrayList<>();
        int index = 0;

        // 处理开头连续的 null 值
        List<DocxFileTemplate> nullGroup = new ArrayList<>();
        while (index < docxFileTemplates.size() && docxFileTemplates.get(index) == null) {
            nullGroup.add(docxFileTemplates.get(index));
            index++;
        }
        if (!nullGroup.isEmpty()) {
            result.add(nullGroup);
        }

        // 处理后续元素
        while (index < docxFileTemplates.size()) {
            List<DocxFileTemplate> currentGroup = new ArrayList<>();
            currentGroup.add(docxFileTemplates.get(index));
            index++;
            while (index < docxFileTemplates.size() && docxFileTemplates.get(index) == null) {
                currentGroup.add(docxFileTemplates.get(index));
                index++;
            }
            result.add(currentGroup);
        }

        return result;
    }
}
